package com.ys.io.p1转换流;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 描述:
 * InputStreamReader :  是一个连接字节流和字符流之间的桥梁，它也是一个输入流
 * <p>
 * InputStream 字节输入流
 * <p>
 * Reader 字符字符流
 * <p>
 * OutputStreamWriter：是一个连接字节流和字符流之间的桥梁，它也是一个输出流
 * <p>
 * OutputStream 字节输出流
 * <p>
 * Writer字符输出流
 * <p>
 * 为什么需要使用转换流？为了解决设备之间的编码方式不统一的问题
 * <p>
 * 场景：D盘根目录下有一个f.txt它使用GBK中文编码，将该文件复制到当前模块路径下面，看看效果。
 * <p>
 * 原路径的文件是GBK中文编码，我的IDEA默认是UTF-8编码。如果进行拷贝可能会出现乱码。
 *
 * OutputStreamWriter:将字节输出流变为字符输出流（Writer对于文字的输出要比OutputStream方便）
 * InputStreamReader:将字节输入流变为字符输入流（InputStream读取的是字节，不方便中文的处理）
 *
 * @author CodeYang
 * @version 2021/1/2 20:27
 */
public class 转换流 {

    public static void main(String[] args) {
        try {
            method01();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 场景1;
     * 当前模块目录下有一个GBK编码的GBK.txt(向上兼容ANSI)，将该文件复制到当前模块路径下面，看看效果。
     * <p>
     * 原路径的文件是GBK中文编码，我的IDEA默认是UTF-8编码。如果进行拷贝可能会出现乱码。
     * <p>
     * 如何解决乱码问题：使用转换流指定编码格式
     *
     *  指定读GBK 读 UTF-8 写 只能针对文本文件的读写
     *  转换流的编码格式必须跟源路径的编码格式保持一致 (读)
     */
    private static void method01() throws Exception {
        // 1: 使用输入流去读文件 2: 使用输出流写文件
        try (

                FileInputStream inputStream = new FileInputStream("day_24/GBK.txt");
                // 1创建转换输入流 可把字节流先转换为字符流
                InputStreamReader isr=   new InputStreamReader(inputStream,"GBK");
                FileOutputStream outputStream = new FileOutputStream("day_24/CopyGBK-utf-8.txt");
                // 把字节流转换为字符流
                OutputStreamWriter osw = new OutputStreamWriter(outputStream,"UTF-8");

        ) {
            //byte[] data = new byte[1024];
            char[] data = new char[1024];
            int len = 0;
            while ((len = isr.read(data)) != -1){
                osw.write(data,0,len);
            }
            osw.flush();
        }

    }
}
